- ThreadLocalMap通过key(ThreadLocal类型)的hashcode来计算数组存储的索引位置i。如果i位置已经存储了对象,那么就往后挪一个位置依次类推,直到找到空的位置,再将对象存放。另外,在最后还需要判断一下当前的存储的对象个数是否已经超出了阈值(threshold的值)大小,如果超出了,需要重新扩充并将所有的对象重新计算位置
- Java中所有错误和异常的父类是
java.lang.Throwable
synchronized
修饰非静态方法,实际上是对调用该方法的对象加锁,称之为对象锁,而修饰静态方法,实际上是对该类对象加锁,俗称类锁volatile
关键字作用- 每次从内存中取值,不从缓存中什么的拿值。这就保证了用
volatile
修饰的共享变量,每次的更新对于其他线程都是可见的 volatile
保证了其他线程的立即可见性,没有保证原子性- 由于有些时候对
volatile
的操作,不会被保存,所以不会造成阻塞,不可用于多线程环境下的计数器
- 每次从内存中取值,不从缓存中什么的拿值。这就保证了用
- Java中基本的编程单元为类
- 实现接口相当于重写方法,方法的重写需要满足:三同一大一小(方法名、返回值类型、形参相同;访问权限 >= 重写前; 抛出异常 <= 重写前)
- 此处应注意接口的方法隐式为
public abstract
,所以实现接口对应方法访问权限应为public
- 此处应注意接口的方法隐式为
- 在继承中代码的执行顺序如下所示
- 父类静态对象 -> 父类静态代码块
- 子类静态对象 -> 子类静态代码块
- 父类非静态对象 -> 父类非静态代码块
- 父类构造函数
- 子类非静态对象 -> 子类非静态代码块
- 子类构造函数
- 集合常见考点
Iterator接口是Collection接口的父接口
wait()
:等待时线程别人可以用sleep()
:等待时线程还是自己的,别人不能用join()
:等待该线程终止,等待调用join方法的线程结束,再继续执行- 如:
t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测
- 如:
yield()
:不会释放锁,只是通知调度器自己可以让出cpu时间片,但只是建议,调度器也不一定采纳,同优先级的其他线程有机会获得锁构造方法是一种特殊的方法,具有以下特点
- 构造方法的方法名必须与类名相同
- 构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型
- 构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域
- 一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码
- 构造方法可以重载,以参数的个数,类型,顺序
多态的作用:提高可重用性和扩展代码模块
HashTable中,key和value都不允许出现null值
volatile
能保证数据的可见性,但不能完全保证数据的原子性,synchronized
即保证了数据的可见性也保证了原子性抽象类和接口都不能被实例化
反射带来的效率问题主要是动态解析类,JVM没法对反射代码优化
字符流和字节流都有缓冲流
面向对象如果有三大特征,那就是:封装、继承、多态
面向对象如果有四大特征,那就是:抽象、封装、继承、多态
外部类的修饰符只能是public,abstract,final
使用泛型的好处:仅仅提高了数据传输的安全性,并没有改变程序运行的性能
- 类型安全
- 消除强制类型转换
Java不同于一般的编译语言和直译语言。它首先将源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了一次编写,到处运行的跨平台特性
Hashtable 的函数都是同步的,这意味着它是线程安全的,它的key、value都不可以为null
synchronized
修饰非静态方法 锁的是this 对象synchronized
修饰静态方法 锁的是class对象二维数组定义,一维长度必须定义,二维可以后续定义
private default protected public 同一个类中 ✔️ ✔️ ✔️ ✔️ 同一个包中 ✔️ ✔️ ✔️ 子类中 ✔️ ✔️ 全局范围内 ✔️ 堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)
栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈)
方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)
标识符的组成:由52个字母A-Z ,a-z ,数字0-9 ,下划线_ , 美元符$组成
Object类中方法
- protected Object clone():创建并返回此对象的一个副本
- boolean equals(Object obj):指示其他某个对象是否与此对象“相等”
- protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
- class getClass():返回此 Object 的运行时类
- int hashCode():返回该对象的哈希码值
- void notify():唤醒在此对象监视器上等待的单个线程
- void notifyAll():唤醒在此对象监视器上等待的所有线程
- String toString():返回该对象的字符串表示
- void wait():在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待
- void wait(long timeout):在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待
- void wait(long timeout, int nanos):在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待
数组是一个对象,不同类型的数组具有不同的类
Java反射机制主要提供了以下功能
- 在运行时判断一个对象的所属类
- 在运行时构造一个类的对象
- 在运行时判断一个类所具有的成员变量和方法
- 在运行时调用一个对象的方法
java中的关键字
- 48个关键字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while
- 2个保留字(现在没用以后可能用到作为关键字):goto、const
- 3个特殊直接量(非关键字):true、false、null
CopyOnWriteArrayList
适用于写少读多的并发场景ReadWriteLock
即为读写锁- 要求写与写之间互斥,读与写之间互斥
- 读与读之间可以并发执行,在读多写少的情况下可以提高效率
switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和boolean类型,String类型是java7开始支持。
处理异常有两种方式(使用try…catch块捕获时可以没有catch块,但当没用catch块的时候必须得有finally块)
- try…catch(捕获处理机制)
- throws(冒泡处理机制)
抽象类不能实例化,因为有抽象方法未实现,可以被抽象类继承,也可以被非抽象类继承
Math.floor()
表示向下取整,返回double类型 (floor—地板)Math.ceil()
表示向上取整,返回double类型 (ceil—天花板)Math.round()
四舍五入,返回int类型使用
Integer a = 1;
或Integer a = Integer.valueOf(1);
在值介于-128至127直接时,作为基本类型使用
Integer a = new Integer(1);
时,无论值是多少,都作为对象函数调用是入栈出栈,栈是在寄存器之下的速度最快,且占的空间少;而自定义异常是存在堆中,因此异常的内存开销大
真正宣布一个对象死亡,至少需要经历2次标记过程。当第一次标记时会同时进行一次筛选(判断此对象是否有必要执行finalize方法,如果对象没有覆盖该方法,就面临死亡,所以说
finalize()
方法是对象逃脱死亡命运的最后一次机会Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节
Java的基本编程单元是类,基本存储单元是变量
类的final成员对象必须满足以下其中一个条件
- 在构造函数中赋值
- 初始化赋值
标准ASCII只使用7个bit,扩展的ASCII使用8个bit
表达式的数据类型自动提升, 关于类型的自动提升,注意下面的规则
- 所有的byte,short,char型的值将被提升为int型
- 如果有一个操作数是long型,计算结果是long型
- 如果有一个操作数是float型,计算结果是float型
- 如果有一个操作数是double型,计算结果是double型
- final常量级别运算在编译过程中就已经出结果了
序列化保存的是对象的状态,静态变量属于类的状态,因此不保存静态变量
基本类型不是对象
错误(Error)的基类是Throwable
Semaphore
:信号量,用于表示共享资源数量。用acquire()
获取资源,用release()
释放资源。CyclicBarrier
:线程到达屏障后等待,当一组线程都到达屏障后才一起恢复执行CountDownLatch
:初始时给定一个值,每次调用countDown值减1,当值为0时阻塞的线程恢复执行内部类可以是静态static的,也可用public,default,protected和private修饰
外部类的修饰符只能是public,abstract,final